package org.luxor.cloud.gateway.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.luxor.cloud.gateway.entity.GatewayRouteEntity;
import org.springframework.cloud.gateway.route.RouteDefinition;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
 * 网关动态路由定义
 *
 * @author Mr.Yan  @date: 2020/11/1
 */
public interface DynamicRouteService {

    /**
     * 发布（根据ID 批量发布）
     *
     * @param routeIds 要发布的id集合
     * @return true-成功；false-失败
     */
    boolean deployByIds(Collection<Long> routeIds);

    /**
     * 下线（根据ID 批量下线）
     *
     * @param routeIds 要下线的id集合
     * @return true-成功；false-失败
     */
    boolean downLineByIds(Collection<Long> routeIds);

    /**
     * 插入一条记录（选择字段，策略插入）
     *
     * @param entity 实体对象
     * @return true-成功；false-失败
     */
    boolean save(GatewayRouteEntity entity);

    /**
     * 删除 (根据ID 批量删除）
     *
     * @param routeIds 要删除的id集合
     * @return true-成功；false-失败
     */
    boolean removeByIds(Collection<Long> routeIds);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     * @return true-成功；false-失败
     */
    boolean updateById(GatewayRouteEntity entity);

    /**
     * 根据 ID 查询
     *
     * @param routeId 主键ID
     * @return 网关API路由定义
     */
    GatewayRouteEntity getById(Long routeId);

    /**
     * 查询网关API路由定义
     *
     * @param routePath    路由路径(如：/users/info)
     * @param routeVersion 路由版本(如：v1)
     * @param routeMethod  路由方法(必须全大写,如：GET|POST|DELETE|PUT|PATCH)
     * @return 网关API路由定义
     */
    Optional<GatewayRouteEntity> getOne(String routePath, String routeVersion, String routeMethod);

    /**
     * 分页查询
     *
     * @param page         分页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @return true-成功；false-失败
     */
    IPage<GatewayRouteEntity> page(IPage<GatewayRouteEntity> page, Wrapper<GatewayRouteEntity> queryWrapper);

    /**
     * 动态路由列表
     *
     * @return 全部动态路由定义列表
     */
    Map<String, RouteDefinition> routeDefinitions();

    /**
     * 违反唯一约束条件吗？
     *
     * @param entity 实体对象
     * @return true-是(不能新增|修改)；false=否(可以新增|修改)
     */
    boolean uniqueCondition(GatewayRouteEntity entity);

    /**
     * 违反不可删除条件吗？
     *
     * @param routeIds 要删除的id集合
     * @return true-是(不能删除状态为'已发布'的记录)；false-否(可以删除)
     */
    boolean notDeleteCondition(Collection<Long> routeIds);

}
